package wapper;

/**
 * 包装类
 * java为基本类型对应的提供了8个包装类
 * btye         Byte
 * short        Short
 * int          Integer
 * long         Long
 * float        Float
 * double       Double
 */
public class IntegerDemo1 {
    public static void main(String[] args) {
        int a = 123;
        //将基本类型转换为对应的包装类
        Integer i1 = new Integer(a);
        Integer i2 = new Integer(a);
        /*
            Integer的valuesOfIntegerDemo1方法重用了1个字节之内的整数对象
            如果整数取值在:-128~127之间会重用对象, 减少内存开销
         */
        Integer i3 = Integer.valueOf(a);
        Integer i4 = Integer.valueOf(a);

        //对象1==对象2, 对比的是地址
        System.out.println(i1==i2);//false
        System.out.println(i3==i4);//true   如果a的值超出-128~127的范围, false

        //对象1.equals(对象2), 对比的是包装类对象的数值
        System.out.println(i1.equals(i2));//true
        System.out.println(i3.equals(i4));//true


        double d = 123.123;
        //Double的valuesOf没有任何额外功能, 内部就是new对象
        Double d1 = Double.valueOf(d);
        Double d2 = Double.valueOf(d);
        System.out.println(d1==d2);//false
        System.out.println(d1.equals(d2));//true

        /*
        数字类型的包装类可以将其内部保存的基本数值类型值以其他数字类型返回
        数字类型之间可以互转
         */
        int i = i1.intValue();//将i1包装类对象内部保存的整数以int形式返回
        System.out.println(i);//123
        double dou = i1.doubleValue();
        System.out.println(dou);//123.0
        //注意: 大类型转换为小类型时可能存在溢出, 丢精度等问题
        byte b = i1.byteValue();
        System.out.println(b);//123

        int id = d1.intValue();
        System.out.println(id);//123
    }
}
